home *** CD-ROM | disk | FTP | other *** search
- package horst;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.PrintWriter;
- import java.util.Vector;
-
- public class EditableHTMLDocument extends HTMLDocument {
- public EditableHTMLDocument(HTMLPane renderer) {
- super(renderer);
- }
-
- void findSelectedElements(Element e, Vector selectedElements, int p0, int p1) {
- if (e.getType() == 9 && inRange(e, p0, p1)) {
- selectedElements.addElement(e);
- }
-
- int nCount = e.getElementCount();
-
- for(int i = 0; i < nCount; ++i) {
- this.findSelectedElements(e.getElementAt(i), selectedElements, p0, p1);
- }
-
- }
-
- public Vector getSelectedElements() {
- Vector v = new Vector();
- if (((HTMLDocument)this).isTextSelected()) {
- this.findSelectedElements(super.m_rootElement, v, super.m_selectedP0, super.m_selectedP1);
- }
-
- return v;
- }
-
- Element getTextAttributeElement(int type) {
- switch (type) {
- case 38:
- case 40:
- case 41:
- case 42:
- case 46:
- case 48:
- case 52:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 68:
- case 72:
- case 73:
- case 74:
- return new Element(type);
- default:
- return null;
- }
- }
-
- static boolean inRange(Element e, int p0, int p1) {
- return e.m_p0 <= p0 && e.m_p1 >= p0 || e.m_p0 >= p0 && e.m_p0 <= p1 || e.m_p0 >= p0 && e.m_p1 <= p1;
- }
-
- static boolean isTotallyInRange(Element e, int p0, int p1) {
- return e.m_p0 >= p0 && e.m_p1 <= p1;
- }
-
- public void setSelectedTextProperties(int[] atts) {
- ((HTMLDocument)this).printTree(super.m_rootElement, 0);
- HTMLDocument.closeLog();
- Vector selectedElements = new Vector();
- Vector v = this.getSelectedElements();
-
- for(int i = v.size() - 1; i >= 0; --i) {
- Element e = (Element)v.elementAt(i);
- new String(e.getCharData());
- if (isTotallyInRange(e, super.m_selectedP0, super.m_selectedP1)) {
- selectedElements.addElement(e);
- } else {
- ElementSplit[] splits = splitElement(e, super.m_selectedP0, super.m_selectedP1);
- if (e.m_parent != null) {
- Element[] newElems = new Element[splits.length];
-
- for(int h = 0; h < splits.length; ++h) {
- newElems[h] = splits[h].m_elem;
- }
-
- e.m_parent.replaceChildElement(e, newElems);
-
- for(int h = 0; h < splits.length; ++h) {
- if (splits[h].m_bSelected) {
- selectedElements.addElement(splits[h].m_elem);
- }
- }
- }
- }
- }
-
- boolean bRebuildViews = false;
-
- for(int i = 0; i < atts.length; ++i) {
- for(int j = 0; j < selectedElements.size(); ++j) {
- Element attElement = this.getTextAttributeElement(atts[i]);
- if (attElement != null) {
- bRebuildViews = true;
- Element selectedElem = (Element)selectedElements.elementAt(j);
- selectedElem.m_parent.replaceChildElement(selectedElem, attElement);
- new String(selectedElem.getCharData());
- attElement.addChild(selectedElem);
- attElement.m_doc = selectedElem.m_doc;
- }
-
- ((HTMLDocument)this).printTree(super.m_rootElement, 0);
- HTMLDocument.closeLog();
- }
- }
-
- if (bRebuildViews) {
- try {
- File f = new File("c:\\browser\\out.html");
- FileOutputStream os = new FileOutputStream(f);
- PrintWriter pw = new PrintWriter(os);
- ((HTMLDocument)this).writeToStream(pw);
- pw.flush();
- pw.close();
- } catch (Exception ex) {
- System.out.println("Exception: " + ex);
- }
- }
-
- }
-
- static ElementSplit[] splitElement(Element e, int p0, int p1) {
- if (p0 > p1) {
- int temp = p0;
- p0 = p1;
- p1 = temp;
- }
-
- new String(e.getCharData());
- ElementSplit[] splits = new ElementSplit[0];
- if (e.m_p0 < p0 && e.m_p1 > p1) {
- splits = new ElementSplit[3];
- Element newElem = new Element(e);
- newElem.setTextPointers(e.m_p0, p0 - 1);
- splits[0] = new ElementSplit(newElem, false);
- newElem = new Element(e);
- newElem.setTextPointers(p0, p1);
- splits[1] = new ElementSplit(newElem, true);
- newElem = new Element(e);
- newElem.setTextPointers(p1 + 1, e.m_p1);
- splits[2] = new ElementSplit(newElem, false);
- } else if (e.m_p0 < p0 && e.m_p1 > p0) {
- splits = new ElementSplit[2];
- Element newElem = new Element(e);
- newElem.setTextPointers(e.m_p0, p0 - 1);
- splits[0] = new ElementSplit(newElem, false);
- newElem = new Element(e);
- newElem.setTextPointers(p0, e.m_p1);
- splits[1] = new ElementSplit(newElem, true);
- } else if (e.m_p0 > p0 && e.m_p0 < p1 && e.m_p1 > p1) {
- splits = new ElementSplit[2];
- Element newElem = new Element(e);
- newElem.setTextPointers(e.m_p0, p1);
- splits[0] = new ElementSplit(newElem, true);
- newElem = new Element(e);
- newElem.setTextPointers(p1 + 1, e.m_p1);
- splits[1] = new ElementSplit(newElem, false);
- }
-
- return splits;
- }
- }
-